home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1996 July: Mac OS SDK / Dev.CD Jul 96 SDK / Dev.CD Jul 96 SDK1.toast / Development Kits (Disc 1) / OpenDoc / OpenDoc Development / Debugging Support / OpenDoc Source Code / Layout / Facet.cpp < prev    next >
Encoding:
Text File  |  1996-04-22  |  64.2 KB  |  2,101 lines  |  [TEXT/MPS ]

  1. /*
  2.     File:        Facet.cpp
  3.  
  4.     Contains:    Implementation of class ODFacet
  5.  
  6.     Owned by:    Joshua Susser
  7.  
  8.     Copyright:    © 1993 - 1995 by Apple Computer, Inc., all rights reserved.
  9.  
  10.     Change History (most recent first):
  11.  
  12.          <2>     3/14/96    EL        1322489 OD Corrupts value of memory loc 18
  13.                                     because it does not check for null in
  14.                                     GetParent
  15.         <52>    10/18/95    JBS        1288922 don't force DrawActiveBorder, wait
  16.                                     for Window::Update; 1293224 use internal
  17.                                     transform in DrawActiveBorder; 1293393
  18.                                     don't invert a lone external transform
  19.         <51>    10/18/95    TJ        Accessing Link though public methods now.
  20.         <50>    10/17/95    jpa        1291724: Prevent crashes in
  21.                                     CreateEmbeddedFacet if e.g. part's
  22.                                     DisplayFrameConnected fails. 1289153:
  23.                                     Prevent corruption of FacetNode tree when
  24.                                     deleting facets.
  25.         <49>     10/8/95    TJ        Fixes Recomended by Refball
  26.         <48>     9/18/95    JBS        1278337 use kODErrCanvasHasNoOwner
  27.         <47>     9/18/95    JBS        1278337 use kODErrCanvasHasNoOwner
  28.         <46>     9/13/95    DM        1277216 GM:API return no ODPoints nor
  29.                                     ODPolygons
  30.         <45>      9/8/95    JBS        1282464 call AdjustBorderShape(NULL) in
  31.                                     ChangeActiveShape; 1283130
  32.                                     DrawActiveBorder: THROW if
  33.                                     AdjustBorderShape returns NULL
  34.         <44>     8/31/95    JBS        1278337 error code cleanup
  35.         <43>     8/29/95    JBS        1261682 allow NULL shape param for Update,
  36.                                     Draw, DrawChildren[Always]; 1265527 return
  37.                                     error if NULL owner for canvas in
  38.                                     CreateEmbeddedFacet; 1280635 fix getting
  39.                                     node of sibling facet; 1280637 problem in
  40.                                     ChangeCavas notifying parts; 1280991
  41.                                     ChangeCanvas should inval aggGeometry
  42.         <42>     8/21/95    NP        1274946:
  43.                                     kODErrInvalidCanvas->kODErrCanvasNotFound
  44.         <41>      8/7/95    JBS        1275083 move Facet inval code to Canvas
  45.         <40>      8/3/95    RR        #1257260: Collapse B classes. Remove
  46.                                     somInit methods. Don't call IsInitialized
  47.                                     or SubclassResponsibility
  48.         <39>     6/29/95    DM        1242642 BB: refcounting: acquire member
  49.                                     vars (not locals) when possible.
  50.         <38>     6/26/95    TÇ        1242642 BB:Fix refcounting bugs
  51.         <37>     6/23/95    JBS        1237891 invalidateAggregateClipShape of
  52.                                     children when internalTranformChange
  53.         <36>     6/23/95    JBS        1251627 fix refcounting throughout file
  54.         <35>     6/21/95    JBS        1259494: OK for extTform to be kODNULL
  55.         <34>     6/20/95    JBS        1257315 change AcquireWindow to GetWindow;
  56.                                     1260681 remove BaseFacet class
  57.         <33>     5/31/95    JBS        1232127 fixed typo in GetFrameTransform
  58.         <32>     5/26/95    RR        #1251403: Multithreading naming support
  59.         <31>     5/25/95    jpa        List.h --> LinkList.h [1253324]
  60.         <30>     5/17/95    JBS        1240846 fix active border updating; 1250177
  61.                                     fix ODCanvas::AcquireOwner refcounting
  62.         <29>     5/15/95    JBS        1240846 flush activeBorderShape when
  63.                                     aggregate clip shape invalidated; 1237811
  64.                                     notify part via GeometryChanged in
  65.                                     InternalTransformChanged; 1245156 implement
  66.                                     Purge
  67.         <28>     5/10/95    JBS        1214984 DrawChildren and DrawChildrenAlways
  68.                                     don't convert the invalidShape; 1224727
  69.                                     Facet hit-testing calls should take point
  70.                                     param in frame coords; 1227547 Coordinate
  71.                                     system for ODWindow::Update and
  72.                                     ODFacet::Update
  73.         <27>      5/2/95    JBS        1243371 fix some exception names
  74.         <26>     4/28/95    JBS        1242501 added top-level SOM exception
  75.                                     handling; 1234639 ContainsPoint can now
  76.                                     deal with NULL clipShape; 1243382
  77.                                     ::AcquireWindowAggregateClipShape smashes
  78.                                     ClipShape; 1229231, 1236877, 1227187 fixed
  79.                                     mem leaks in Invalidate,
  80.                                     InvalidateActiveBorder, DrawActiveBorder
  81.         <25>     4/27/95    JBS        1209506 $5 comments eliminated
  82.         <24>     4/14/95    JBS        1216535 use part's storageUnit instead of
  83.                                     frame's to get Session in RemoveFacet
  84.         <23>      3/8/95    JBS        1165158 AdjustBorderShape implementation
  85.         <22>     2/28/95    JBS        1198509 added fActiveBorderShape, moved
  86.                                     active border display code to border.cpp
  87.         <21>     1/13/95    RR        Remove MouseEnter, MouseWithin and
  88.                                     MouseLeave
  89.         <20>      1/5/95    JBS        1174640: offscreen canvas drawing broken;
  90.                                     1201572: Invalidate smashes window origin
  91.         <19>    12/20/94    jpa        Modified AcquireAggregateClipShape to set
  92.                                     geometry mode of aggregate clip shape to
  93.                                     kODLoseGeometry; should speed up clipping.
  94.                                     [1168281]
  95.         <18>    12/20/94    jpa        Use kODLoseGeometry mode for clip shapes
  96.                                     [1168281]
  97.         <17>     11/2/94    eeh        #1179885 (for JBS): stop
  98.                                     AcquireAggregateClipShape from smashing
  99.                                     clipShape.
  100.         <16>    10/18/94    JBS        1188065: change return type of DragEnter &
  101.                                     DragWithin to ODDragResult
  102.         <15>     9/29/94    JBS        1188214: more coord bias impl
  103.         <14>     9/29/94    RA        1189812: Mods for 68K build.
  104.         <13>     9/22/94    JBS        1188214: coordinate bias implementation
  105.         <12>     8/31/94    TÇ        #1183129, #1183116, #1183119, #1183111:
  106.                                     Lots of ErrorCode cleanup.
  107.         <11>     8/24/94    JBS        1181909: new active border appearance
  108.         <10>     8/18/94    jpa        Filled in imaging factories [1180387]
  109.          <9>     8/16/94    JBS        1180387: add CreateCanvas()
  110.          <8>     8/15/94    JBS        1180387: added Imaging factory methods
  111.          <7>     8/12/94    JBS        1179920: move fWindow from Facet to Frame
  112.          <6>     8/10/94    JBS        1179919: coordinate system bias changes
  113.          <5>      8/9/94    VL        1179857: DragEnter and DragWithin return
  114.                                     ODBoolean.
  115.          <4>      8/5/94    JBS        #1179151 Part API cleanup
  116.          <3>     7/17/94    TÇ        use ODDeleteObject() when deleting objects
  117.                                     in the somUninit method.
  118.          <2>      7/7/94    JBS        un-commented code
  119.          <1>     6/30/94    JBS        first checked in
  120.          <0>     6/30/94    SV        SOMverted
  121.          <7>      5/9/94    MB        #1162181: Changes necessary to install MMM.
  122.          <6>      4/6/94    JBS        1155477
  123.          <5>     3/29/94    JBS        1153059 ::ChangeCanvas() - notify parts
  124.          <4>     3/28/94    CG        1153547: Renamed XMPSessn.h to XMPSessM.h
  125.          <3>     3/25/94    JA        JBS: Changes to ChangeHighlight (1148310)
  126.          <2>     3/15/94    MB        Changes to support SCpp/ASLM builds,
  127.                                     #1150864.
  128.          <1>     3/11/94    JBS        first checked in
  129.          <5>     2/17/94    JBS        help fix#1142976
  130.          <4>     2/17/94    JBS        #1142976 fix inconsistent facet coords,
  131.                                      #1144049 ChangeExternalTransform notifies
  132.                                     parts of child facets
  133.          <3>     2/16/94    JA        Include new AltPoint.h.
  134.          <2>     2/15/94    JBS        RADAR bug #1141506 - fix grafPort origin
  135.                                     restoration in invalidation methods
  136.         <21>      2/7/94    JA        Capitalized THROW.
  137.         <20>      2/7/94    JA        Utility.h --> XMPUtils.h
  138.         <19>      2/3/94    JA        Tiger Team Makeover!
  139.         <18>      2/1/94    SS        SS: RootFacet fix to ::Update
  140.                                     JBS: Offscreen canvas fixes, better
  141.                                     in/validating
  142.         <17>     1/26/94    RR        Call Dispatcher::InvalidateFacetUnderMouse
  143.         <16>     1/24/94    SS        Checkin for Joshua (see below)
  144.         <15+>     1/13/94    JBS        active border displays fActiveShape
  145.                                        added offscreen canvas support
  146.         <15>     1/20/94    SS        Transform fix to GetAggregrateClipShape
  147.         <14>     1/11/94    TÇ        Init... changes
  148.         <13>    12/21/93    JBS        InitFacet changes
  149.         <12>    12/15/93    JBS        add fActiveShape & fWindow, plus accessors
  150.         <11>     12/3/93    TÇ        return ODFacet* from CreateEmebeddedFacet
  151.         <10>     12/3/93    TÇ        Stop including ODError.h, it is included
  152.                                     as ErrorDef.h inside Except.h
  153.          <9>    11/24/93    JA        cfront fixes.
  154.          <8>    11/24/93    VL        Rolled back changes as ASLM build breaks
  155.                                     the THINK build.
  156.          <7>    11/23/93    VL        Made this work with ASLM.
  157.          <6>    11/23/93    JA        Use new Shape API.
  158.          <5>    11/19/93    PH        Add casts to fix for CFront/ASLM
  159.          <4>    11/18/93    JBS        remove fWindow, add mouse tracking
  160.          <3>    11/16/93    JBS        add child drawing and moving methods
  161.          <2>    11/16/93    JBS        add fIsSelected, fHighlight
  162.          <1>    11/13/93    JBS        first checked in
  163.     
  164.     In Progress:
  165.         
  166. */
  167.  
  168. #define ODFacet_Class_Source
  169.  
  170. #ifndef SOM_ODFacet_xih
  171. #define VARIABLE_MACROS
  172. #include <Facet.xih>
  173. #endif
  174.  
  175. #ifndef _ALTPOINT_
  176. #include "AltPoint.h"
  177. #endif
  178.  
  179. #ifndef _FACETNOD_
  180. #include "FacetNod.h"
  181. #endif
  182.  
  183. #ifndef SOM_ODFacetIterator_xh
  184. #include "FacetItr.xh"
  185. #endif
  186.  
  187. #ifndef SOM_ODFrame_xh
  188. #include <Frame.xh>
  189. #endif
  190.  
  191. #ifndef SOM_ODPart_xh
  192. #include <Part.xh>
  193. #endif
  194.  
  195. #ifndef SOM_ODCanvas_xh
  196. #include <Canvas.xh>
  197. #endif
  198.  
  199. #ifndef SOM_ODShape_xh
  200. #include <Shape.xh>
  201. #endif
  202.  
  203. #ifndef SOM_ODTransform_xh
  204. #include <Trnsform.xh>
  205. #endif
  206.  
  207. #ifndef SOM_ODWindow_xh
  208. #include <Window.xh>
  209. #endif
  210.  
  211. #ifndef SOM_ODSession_xh
  212. #include <ODSessn.xh>
  213. #endif
  214.  
  215. #ifndef SOM_ODDispatcher_xh
  216. #include <Disptch.xh>
  217. #endif
  218.  
  219. #ifndef SOM_ODStorageUnit_xh
  220. #include <StorageU.xh>
  221. #endif
  222.  
  223. #ifndef _LINKLIST_
  224. #include "LinkList.h"
  225. #endif
  226.  
  227. #ifndef _NODE_
  228. #include "Node.h"
  229. #endif
  230.  
  231. #ifndef _EXCEPT_
  232. #include "Except.h"
  233. #endif
  234.  
  235. #ifndef _ODUTILS_
  236. #include <ODUtils.h>
  237. #endif
  238.  
  239. #ifndef _ODTYPES_
  240. #include <ODTypes.h>
  241. #endif
  242.  
  243. #ifndef _ODMEMORY_
  244. #include "ODMemory.h"
  245. #endif
  246.  
  247. #ifndef _ODMATH_
  248. #include "ODMath.h"
  249. #endif
  250.  
  251. #ifndef _FOCUSLIB_
  252. #include "FocusLib.h"
  253. #endif
  254.  
  255. #ifndef _BIAS_
  256. #include "Bias.h"
  257. #endif
  258.  
  259. #ifndef _BORDER_
  260. #include "Border.h"
  261. #endif
  262.  
  263. #ifndef _ODDEBUG_
  264. #include "ODDebug.h"
  265. #endif
  266.  
  267. #ifndef som_h
  268. #include "som.h"
  269. #endif
  270.  
  271. #ifndef __PRINTING__
  272. #include <Printing.h>
  273. #endif
  274.  
  275. #ifndef _TEMPOBJ_
  276. #include "TempObj.h"
  277. #endif
  278.  
  279. #pragma segment ODFacet
  280.  
  281.  
  282. //=====================================================================================
  283. // Constants
  284. //=====================================================================================
  285.  
  286. #define kNoBias kODNULL
  287.  
  288. //=====================================================================================
  289. // ODFacet
  290. //=====================================================================================
  291.  
  292. //------------------------------------------------------------------------------
  293. // ODFacet: somUninit
  294. //------------------------------------------------------------------------------
  295.  
  296. SOM_Scope void  SOMLINK ODFacetsomUninit(ODFacet *somSelf)
  297. {
  298.     ODFacetData *somThis = ODFacetGetData(somSelf);
  299.     ODFacetMethodDebug("ODFacet","somUninit");
  300.  
  301.     ODSafeReleaseObject(_fFrame);
  302.     ODSafeReleaseObject(_fClipShape);
  303.     ODSafeReleaseObject(_fActiveShape);
  304.     ODSafeReleaseObject(_fExternalTransform);
  305.     
  306.     if( _fNode ) {
  307.         Node* parent = _fNode->GetParent();
  308.         if (parent)
  309.             parent->RemoveChild(*_fNode);
  310.         delete _fNode;
  311.     }
  312.     
  313.     ODSafeReleaseObject(_fAggregateClipShape);
  314.     ODSafeReleaseObject(_fWindowAggregateClipShape);
  315.     ODSafeReleaseObject(_fFrameTransform);
  316.     ODSafeReleaseObject(_fContentTransform);
  317.     ODSafeReleaseObject(_fWindowFrameTransform);
  318.     ODSafeReleaseObject(_fWindowContentTransform);
  319.     ODSafeReleaseObject(_fActiveBorderShape);
  320. }
  321.  
  322. //------------------------------------------------------------------------------
  323. // ODFacet: InitFacet
  324. //------------------------------------------------------------------------------
  325.  
  326. SOM_Scope void  SOMLINK ODFacetInitFacet(ODFacet *somSelf, Environment *ev,
  327.         ODFrame* frame,
  328.         ODShape* clipShape,
  329.         ODTransform* externalTransform,
  330.         ODCanvas* canvas,
  331.         ODCanvas* biasCanvas)
  332. {
  333.     ODFacetData *somThis = ODFacetGetData(somSelf);
  334.     ODFacetMethodDebug("ODFacet","InitFacet");
  335.  
  336.     SOM_TRY
  337.     
  338.         if ( frame == kODNULL ) THROW(kODErrIllegalNullFrameInput);
  339.     
  340.         /* Moved from somInit. SOM itself sets fields to zero
  341.         _fFrame = kODNULL;
  342.         _fClipShape = kODNULL;
  343.         _fActiveShape = kODNULL;
  344.         _fExternalTransform = kODNULL;
  345.         _fCanvas = kODNULL;
  346.         _fPartInfo = kODNULL;
  347.         _fIsSelected = kODFalse;
  348.         
  349.         _fNode = kODNULL;
  350.         _fNeedsUpdate = kODFalse;
  351.         _fIsUpdating = kODFalse;
  352.     
  353.         _fAggregateClipShape = kODNULL;
  354.         _fWindowAggregateClipShape = kODNULL;
  355.         _fFrameTransform = kODNULL;
  356.         _fContentTransform = kODNULL;
  357.         _fWindowFrameTransform = kODNULL;
  358.         _fWindowContentTransform = kODNULL;
  359.         _fActiveBorderShape = kODNULL;
  360.         */
  361.         _fHighlight = kODNoHighlight;
  362.         
  363.         somSelf->InitObject(ev);
  364.         
  365.     
  366.         _fFrame = frame;
  367.         ODAcquireObject(ev, _fFrame);
  368.     
  369.         _fClipShape = BiasShapeSet(ev, clipShape, biasCanvas);
  370.         ODAcquireObject(ev, _fClipShape);
  371.     
  372.         _fExternalTransform = BiasTransformSet(ev, externalTransform, biasCanvas);
  373.         ODAcquireObject(ev, _fExternalTransform);
  374.     
  375.         if ( canvas )
  376.         {
  377.             _fCanvas = canvas;
  378.             _fCanvas->SetFacet(ev, somSelf);
  379.         }
  380.     
  381.         _fNode = new FacetNode(somSelf);    // must be a root facet!
  382.     SOM_CATCH_ALL
  383.     SOM_ENDTRY
  384. }
  385.  
  386. //------------------------------------------------------------------------------
  387. // ODFacet: InitChildFacet
  388. //------------------------------------------------------------------------------
  389.  
  390. SOM_Scope void  SOMLINK ODFacetInitChildFacet(ODFacet *somSelf, Environment *ev,
  391.         FacetNode* node,
  392.         ODFrame* frame,
  393.         ODShape* clipShape,
  394.         ODTransform* externalTransform,
  395.         ODCanvas* canvas,
  396.         ODCanvas* biasCanvas)
  397. {
  398.     ODFacetData *somThis = ODFacetGetData(somSelf);
  399.     ODFacetMethodDebug("ODFacet","InitChildFacet");
  400.  
  401.     SOM_TRY
  402.             
  403.         if ( node == kODNULL ) THROW(kODErrIllegalNullFacetInput);
  404.         if ( frame == kODNULL ) THROW(kODErrIllegalNullFrameInput);
  405.     
  406.         /* Moved from somInit. SOM itself sets fields to zero
  407.         _fFrame = kODNULL;
  408.         _fClipShape = kODNULL;
  409.         _fActiveShape = kODNULL;
  410.         _fExternalTransform = kODNULL;
  411.         _fCanvas = kODNULL;
  412.         _fPartInfo = kODNULL;
  413.         _fIsSelected = kODFalse;
  414.         
  415.         _fNode = kODNULL;
  416.         _fNeedsUpdate = kODFalse;
  417.         _fIsUpdating = kODFalse;
  418.     
  419.         _fAggregateClipShape = kODNULL;
  420.         _fWindowAggregateClipShape = kODNULL;
  421.         _fFrameTransform = kODNULL;
  422.         _fContentTransform = kODNULL;
  423.         _fWindowFrameTransform = kODNULL;
  424.         _fWindowContentTransform = kODNULL;
  425.         _fActiveBorderShape = kODNULL;
  426.         */
  427.         _fNode = node;
  428.  
  429.         _fHighlight = kODNoHighlight;
  430.         somSelf->InitObject(ev);
  431.     
  432.         _fFrame = frame;
  433.         ODAcquireObject(ev, _fFrame);
  434.     
  435.         _fClipShape = BiasShapeSet(ev, clipShape, biasCanvas);
  436.         ODAcquireObject(ev, _fClipShape);
  437.     
  438.         _fExternalTransform = BiasTransformSet(ev, externalTransform, biasCanvas);
  439.         ODAcquireObject(ev, _fExternalTransform);
  440.     
  441.         if ( canvas )
  442.         {
  443.             _fCanvas = canvas;
  444.             _fCanvas->SetFacet(ev, somSelf);
  445.         }
  446.     SOM_CATCH_ALL
  447.     SOM_ENDTRY
  448. }
  449.  
  450. //------------------------------------------------------------------------------
  451. // ODFacet: Purge
  452. //------------------------------------------------------------------------------
  453.  
  454. SOM_Scope ODSize  SOMLINK ODFacetPurge(ODFacet *somSelf, Environment *ev,
  455.         ODSize size)
  456. {
  457.     ODFacetData *somThis = ODFacetGetData(somSelf);
  458.     ODFacetMethodDebug("ODFacet","Purge");
  459.  
  460.     ODSize freed = 0;    ODVolatile(freed);
  461.  
  462.     SOM_TRY
  463.         // purge non-computed objects
  464.         if ( _fCanvas )                freed += _fCanvas->Purge(ev, size-freed);
  465.         if ( _fClipShape )            freed += _fClipShape->Purge(ev, size-freed);
  466.         if ( _fActiveShape )        freed += _fActiveShape->Purge(ev, size-freed);
  467.         if ( _fExternalTransform )    freed += _fExternalTransform->Purge(ev, size-freed);
  468.         if ( _fActiveBorderShape )    freed += _fActiveBorderShape->Purge(ev, size-freed);
  469.     
  470.         // flush cached geometry, purging first if other owners
  471.         if ( _fAggregateClipShape )
  472.         {
  473.             if ( _fAggregateClipShape->GetRefCount(ev) > 1 )
  474.                 freed += _fAggregateClipShape->Purge(ev, size-freed);
  475.             ODReleaseObject(ev, _fAggregateClipShape);
  476.         }
  477.         
  478.         if ( _fWindowAggregateClipShape )
  479.         {
  480.             if ( _fWindowAggregateClipShape->GetRefCount(ev) > 1 )
  481.                 freed += _fWindowAggregateClipShape->Purge(ev, size-freed);
  482.             ODReleaseObject(ev, _fWindowAggregateClipShape);
  483.         }
  484.         
  485.         if ( _fFrameTransform )
  486.         {
  487.             if ( _fFrameTransform->GetRefCount(ev) > 1 )
  488.                 freed += _fFrameTransform->Purge(ev, size-freed);
  489.             ODReleaseObject(ev, _fFrameTransform);
  490.         }
  491.         
  492.         if ( _fContentTransform )
  493.         {
  494.             if ( _fContentTransform->GetRefCount(ev) > 1 )
  495.                 freed += _fContentTransform->Purge(ev, size-freed);
  496.             ODReleaseObject(ev, _fContentTransform);
  497.         }
  498.         
  499.         if ( _fWindowFrameTransform )
  500.         {
  501.             if ( _fWindowFrameTransform->GetRefCount(ev) > 1 )
  502.                 freed += _fWindowFrameTransform->Purge(ev, size-freed);
  503.             ODReleaseObject(ev, _fWindowFrameTransform);
  504.         }
  505.         
  506.         if ( _fWindowContentTransform )
  507.         {
  508.             if ( _fWindowContentTransform->GetRefCount(ev) > 1 )
  509.                 freed += _fWindowContentTransform->Purge(ev, size-freed);
  510.             ODReleaseObject(ev, _fWindowContentTransform);
  511.         }    
  512.  
  513.         // dh - call parent's purge method
  514.          freed += parent_Purge(somSelf, ev, size);
  515.     SOM_CATCH_ALL
  516.         WARN("Error %ld trying to purge in ODFacetPurge",ErrorCode());
  517.         SetErrorCode(kODNoError);        // dh - Eat the exception; Purge should not 
  518.                                         // propagate it because clients function
  519.                                         // fine whether memory was purged or not.
  520.     SOM_ENDTRY
  521.     
  522.     return freed;
  523. }
  524.  
  525. //------------------------------------------------------------------------------
  526. // ODFacet: GetFrame
  527. //------------------------------------------------------------------------------
  528.  
  529. SOM_Scope ODFrame*  SOMLINK ODFacetGetFrame(ODFacet *somSelf, Environment *ev)
  530. {
  531.     ODFacetData *somThis = ODFacetGetData(somSelf);
  532.     ODFacetMethodDebug("ODFacet","GetFrame");
  533.  
  534.     return _fFrame;
  535. }
  536.  
  537. //------------------------------------------------------------------------------
  538. // ODFacet: CreateEmbeddedFacet
  539. //------------------------------------------------------------------------------
  540.  
  541. SOM_Scope ODFacet*  SOMLINK ODFacetCreateEmbeddedFacet(ODFacet *somSelf, Environment *ev,
  542.         ODFrame* frame,
  543.         ODShape* clipShape,
  544.         ODTransform* externalTransform,
  545.         ODCanvas* canvas,
  546.         ODCanvas* biasCanvas,
  547.         ODFacet* siblingFacet,
  548.         ODFramePosition position)
  549. {
  550.     ODFacetData *somThis = ODFacetGetData(somSelf);
  551.     ODFacetMethodDebug("ODFacet","CreateEmbeddedFacet");
  552.  
  553.     ODFacet* newFacet  = kODNULL;        ODVolatile(newFacet);
  554.     FacetNode* newNode = kODNULL;        ODVolatile(newNode);
  555.     FacetNode* childNode = kODNULL;
  556.  
  557.     SOM_TRY
  558.         if ( frame == kODNULL )
  559.             THROW(kODErrIllegalNullFrameInput);
  560.         if ( canvas != kODNULL )
  561.         {
  562.             TempODPart owner = canvas->AcquireOwner(ev);
  563.             if ( (ODPart*)owner == kODNULL )
  564.                 THROW(kODErrCanvasHasNoOwner);
  565.         }
  566.     
  567.         newFacet = new ODFacet();
  568.         THROW_IF_NULL(newFacet);
  569.         
  570.         newNode = new FacetNode(newFacet);
  571.         THROW_IF_NULL(newNode);
  572.         
  573.         if ( siblingFacet != kODNULL )
  574.             childNode = siblingFacet->GetNode(ev);
  575.     
  576.         if ( position == kODFrameInFront )
  577.         {
  578.             if ( childNode != kODNULL )
  579.                 _fNode->AddChildBefore(*childNode, newNode);
  580.             else
  581.                 _fNode->AddChildFirst(newNode);
  582.         }
  583.         else if ( position == kODFrameBehind )
  584.         {
  585.             if ( childNode != kODNULL )
  586.                 _fNode->AddChildAfter(*childNode, newNode);
  587.             else
  588.                 _fNode->AddChildLast(newNode);
  589.         }
  590.         else
  591.             THROW(kODErrUnsupportedFramePositionCode);
  592.     
  593.         newFacet->InitChildFacet(ev, newNode, frame, clipShape, externalTransform,
  594.                                     canvas, biasCanvas);
  595.         newNode = kODNULL;                            // owned by facet now
  596.         frame->FacetAdded(ev, newFacet);
  597.     SOM_CATCH_ALL
  598.         ODDeleteObject(newFacet);
  599.         if( newNode ) {
  600.             Node* parent = _fNode->GetParent();
  601.             if (parent)
  602.                 parent->RemoveChild(*newNode);
  603.             delete newNode;
  604.         }
  605.     SOM_ENDTRY
  606.     return newFacet;
  607. }
  608.             
  609. //------------------------------------------------------------------------------
  610. // ODFacet: RemoveFacet
  611. //------------------------------------------------------------------------------
  612.  
  613. SOM_Scope void  SOMLINK ODFacetRemoveFacet(ODFacet *somSelf, Environment *ev,
  614.         ODFacet* facet)
  615. {
  616.     ODFacetData *somThis = ODFacetGetData(somSelf);
  617.     ODFacetMethodDebug("ODFacet","RemoveFacet");
  618.  
  619.     SOM_TRY
  620.         ASSERT( (facet->GetContainingFacet(ev) == somSelf), kODErrInvalidFacet);
  621.         
  622.         // must get StorageUnit from part as frame might be non-persistent
  623.         TempODPart tempPart = _fFrame->AcquirePart(ev);
  624.         tempPart->GetStorageUnit(ev)->GetSession(ev)->
  625.             GetDispatcher(ev)->InvalidateFacetUnderMouse(ev);
  626.         _fNode->RemoveChild(*(facet->GetNode(ev)));
  627.         facet->GetFrame(ev)->FacetRemoved(ev, facet);    // tells part to remove children
  628.     SOM_CATCH_ALL
  629.     SOM_ENDTRY
  630. }
  631.  
  632. //------------------------------------------------------------------------------
  633. // ODFacet: MoveBefore
  634. //------------------------------------------------------------------------------
  635.  
  636. SOM_Scope void  SOMLINK ODFacetMoveBefore(ODFacet *somSelf, Environment *ev,
  637.         ODFacet* child,
  638.         ODFacet* sibling)
  639. {
  640.     ODFacetData *somThis = ODFacetGetData(somSelf);
  641.     ODFacetMethodDebug("ODFacet","MoveBefore");
  642.  
  643.     SOM_TRY
  644.         Node* childNode;
  645.         Node* siblingNode;
  646.     
  647.         if ( child )
  648.         {
  649.             childNode = child->GetNode(ev);
  650.             _fNode->RemoveChild(*childNode);
  651.             if ( sibling )
  652.             {
  653.                 siblingNode = sibling->GetNode(ev);
  654.                 _fNode->AddChildBefore(*siblingNode, childNode);
  655.             }
  656.             else
  657.             {
  658.                 _fNode->AddChildFirst(childNode);
  659.             }
  660.         }
  661.     SOM_CATCH_ALL
  662.     SOM_ENDTRY
  663. }
  664.  
  665. //------------------------------------------------------------------------------
  666. // ODFacet: MoveBehind
  667. //------------------------------------------------------------------------------
  668.  
  669. SOM_Scope void  SOMLINK ODFacetMoveBehind(ODFacet *somSelf, Environment *ev,
  670.         ODFacet* child,
  671.         ODFacet* sibling)
  672. {
  673.     ODFacetData *somThis = ODFacetGetData(somSelf);
  674.     ODFacetMethodDebug("ODFacet","MoveBehind");
  675.  
  676.     SOM_TRY
  677.         Node* childNode;
  678.         Node* siblingNode;
  679.     
  680.         if ( child )
  681.         {
  682.             childNode = child->GetNode(ev);
  683.             _fNode->RemoveChild(*childNode);
  684.             if ( sibling )
  685.             {
  686.                 siblingNode = sibling->GetNode(ev);
  687.                 _fNode->AddChildAfter(*siblingNode, childNode);
  688.             }
  689.             else
  690.             {
  691.                 _fNode->AddChildLast(childNode);
  692.             }
  693.         }
  694.     SOM_CATCH_ALL
  695.     SOM_ENDTRY
  696. }
  697.  
  698. //------------------------------------------------------------------------------
  699. // ODFacet: GetContainingFacet
  700. //------------------------------------------------------------------------------
  701.  
  702. SOM_Scope ODFacet*  SOMLINK ODFacetGetContainingFacet(ODFacet *somSelf, Environment *ev)
  703. {
  704.     ODFacetData *somThis = ODFacetGetData(somSelf);
  705.     ODFacetMethodDebug("ODFacet","GetContainingFacet");
  706.  
  707.     SOM_TRY
  708.         FacetNode* parent = (FacetNode*) _fNode->GetParent();
  709.         if (parent)
  710.             return parent->GetFacet();
  711.         else
  712.             return kODNULL;
  713.     SOM_CATCH_ALL
  714.     SOM_ENDTRY
  715.     return kODNULL;
  716. }
  717.  
  718. //------------------------------------------------------------------------------
  719. // ODFacet: CreateFacetIterator
  720. //------------------------------------------------------------------------------
  721.  
  722. SOM_Scope ODFacetIterator*  SOMLINK ODFacetCreateFacetIterator(ODFacet *somSelf, Environment *ev,
  723.         ODTraversalType traversalType, 
  724.         ODSiblingOrder siblingOrder)
  725. {
  726.     ODFacetData *somThis = ODFacetGetData(somSelf);
  727.     ODFacetMethodDebug("ODFacet","CreateFacetIterator");
  728.  
  729.     ODFacetIterator* iter = kODNULL; ODVolatile(iter);
  730.     SOM_TRY
  731.         iter = new ODFacetIterator();
  732.         THROW_IF_NULL(iter);
  733.         iter->InitFacetIterator(ev, somSelf, traversalType, siblingOrder);
  734.     SOM_CATCH_ALL
  735.         ODDeleteObject(iter);
  736.         iter = kODNULL;
  737.     SOM_ENDTRY
  738.     return iter;
  739. }
  740.  
  741. //------------------------------------------------------------------------------
  742. // ODFacet: ChangeGeometry
  743. //------------------------------------------------------------------------------
  744.  
  745. SOM_Scope void  SOMLINK ODFacetChangeGeometry(ODFacet *somSelf, Environment *ev,
  746.         ODShape* clipShape,
  747.         ODTransform* transform,
  748.         ODCanvas* biasCanvas)
  749. {
  750.     ODFacetData *somThis = ODFacetGetData(somSelf);
  751.     ODFacetMethodDebug("ODFacet","ChangeGeometry");
  752.     
  753.     SOM_TRY
  754.         ODBoolean clipShapeChanged = kODFalse;
  755.         ODBoolean externalTransformChanged = kODFalse;
  756.     
  757.         if ( clipShape )
  758.         {
  759.             ODAcquireObject(ev, clipShape);
  760.             ODReleaseObject(ev, _fClipShape);
  761.             _fClipShape = BiasShapeSet(ev, clipShape, biasCanvas);
  762.             clipShapeChanged = kODTrue;
  763.             somSelf->InvalidateAggregateClipShape(ev);
  764.         }
  765.     
  766.         if ( transform )
  767.         {
  768.             ODAcquireObject(ev, transform);
  769.             ODReleaseObject(ev, _fExternalTransform);
  770.             _fExternalTransform = BiasTransformSet(ev, transform, biasCanvas);
  771.             externalTransformChanged = kODTrue;
  772.             somSelf->InvalidateAggregateTransforms(ev);
  773.             somSelf->InvalidateAggregateClipShape(ev);
  774.         }
  775.             
  776.         ODFacetIterator* i = new ODFacetIterator();
  777.         THROW_IF_NULL(i);
  778.         i->InitFacetIterator(ev, somSelf, kODTopDown, kODFrontToBack);
  779.         for (ODFacet* facet = i->First(ev); i->IsNotComplete(ev); facet = i->Next(ev))
  780.         {
  781.             TempODPart tempPart = facet->GetFrame(ev)->AcquirePart(ev);
  782.             tempPart->GeometryChanged(ev, facet, clipShapeChanged, externalTransformChanged);
  783.         }
  784.         ODDeleteObject(i);
  785.     SOM_CATCH_ALL
  786.     SOM_ENDTRY
  787. }
  788.  
  789. //------------------------------------------------------------------------------
  790. // ODFacet: CreateShape
  791. //------------------------------------------------------------------------------
  792.  
  793. SOM_Scope ODShape*  SOMLINK ODFacetCreateShape(ODFacet *somSelf, Environment *ev)
  794. {
  795.     ODFacetData *somThis = ODFacetGetData(somSelf);
  796.     ODFacetMethodDebug("ODFacet","CreateShape");
  797.  
  798.     ODShape *s = kODNULL;  ODVolatile(s);
  799.     SOM_TRY
  800.         s = new ODShape;
  801.         THROW_IF_NULL(s);
  802.         s->InitShape(ev);
  803.     SOM_CATCH_ALL
  804.         ODDeleteObject(s);
  805.         s = kODNULL;
  806.     SOM_ENDTRY
  807.     return s;
  808. }
  809.  
  810.  
  811. //------------------------------------------------------------------------------
  812. // ODFacet: AcquireClipShape
  813. //------------------------------------------------------------------------------
  814.  
  815. SOM_Scope ODShape*  SOMLINK ODFacetAcquireClipShape(ODFacet *somSelf, Environment *ev,
  816.         ODCanvas* biasCanvas)
  817. {
  818.     ODFacetData *somThis = ODFacetGetData(somSelf);
  819.     ODFacetMethodDebug("ODFacet","AcquireClipShape");
  820.  
  821.     SOM_TRY
  822.         if ( _fClipShape )
  823.             return BiasShapeGet(ev, _fClipShape, biasCanvas);
  824.         else
  825.             return ODCopyAndRelease(ev,  _fFrame->AcquireFrameShape(ev, biasCanvas));
  826.     SOM_CATCH_ALL
  827.     SOM_ENDTRY
  828.     return kODNULL;
  829. }
  830.  
  831. //------------------------------------------------------------------------------
  832. // ODFacet: AcquireAggregateClipShape
  833. //------------------------------------------------------------------------------
  834.  
  835. SOM_Scope ODShape*  SOMLINK ODFacetAcquireAggregateClipShape(ODFacet *somSelf, Environment *ev,
  836.         ODCanvas* biasCanvas)
  837. {
  838.     ODFacetData *somThis = ODFacetGetData(somSelf);
  839.     ODFacetMethodDebug("ODFacet","AcquireAggregateClipShape");
  840.  
  841.     SOM_TRY
  842.         if ( !_fAggregateClipShape )
  843.         {
  844.             ODFacet* parent = somSelf->GetContainingFacet(ev);
  845.     
  846.             // Determine whether canvas is geometric or whether we can punt to regions: [jpa]
  847.             ODGeometryMode mode = _fCanvas  ?GetCanvasGeometryMode(ev,_fCanvas)
  848.                                             :kODLoseGeometry;
  849.                 
  850.             if ( _fCanvas && _fCanvas->IsOffscreen(ev) )
  851.             {
  852.                 _fAggregateClipShape = ODCopyAndRelease(ev, _fFrame->AcquireFrameShape(ev, kODNULL));
  853.                 _fAggregateClipShape->SetGeometryMode(ev,mode);
  854.             }
  855.             else
  856.             {
  857.                 _fAggregateClipShape = ODCopyAndRelease(ev, somSelf->AcquireClipShape(ev, kODNULL));
  858.                 _fAggregateClipShape->SetGeometryMode(ev,mode);
  859.                 if ( parent )
  860.                 {
  861.                     TempODShape parentClip = kODNULL;
  862.                     TempODTransform xform = kODNULL;
  863.                     parentClip = ODCopyAndRelease(ev, parent->AcquireAggregateClipShape(ev, kODNULL));
  864.                     xform = ODCopyAndRelease(ev, 
  865.                         parent->GetFrame(ev)->AcquireInternalTransform(ev, kODNULL));
  866.                     if ( _fExternalTransform != kODNULL )
  867.                         xform->PreCompose(ev, _fExternalTransform);
  868.                     parentClip->InverseTransform(ev, xform);
  869.                     _fAggregateClipShape->Intersect(ev, parentClip);
  870.                 }
  871.             }
  872.         }
  873.         return BiasShapeGet(ev, _fAggregateClipShape, biasCanvas);
  874.     SOM_CATCH_ALL
  875.     SOM_ENDTRY
  876.     return kODNULL;
  877. }
  878.  
  879. //------------------------------------------------------------------------------
  880. // ODFacet: AcquireWindowAggregateClipShape
  881. //------------------------------------------------------------------------------
  882.  
  883. SOM_Scope ODShape*  SOMLINK ODFacetAcquireWindowAggregateClipShape(ODFacet *somSelf, Environment *ev,
  884.         ODCanvas* biasCanvas)
  885. {
  886.     ODFacetData *somThis = ODFacetGetData(somSelf);
  887.     ODFacetMethodDebug("ODFacet","AcquireWindowAggregateClipShape");
  888.  
  889.     SOM_TRY
  890.         ODFacet* parent = somSelf->GetContainingFacet(ev);
  891.     
  892.         if ( !_fWindowAggregateClipShape )
  893.         {
  894.             // Determine whether canvas is geometric or whether we can punt to regions: [jpa]
  895.             ODGeometryMode mode = _fCanvas  ?GetCanvasGeometryMode(ev,_fCanvas)
  896.                                             :kODLoseGeometry;
  897.             _fWindowAggregateClipShape = ODCopyAndRelease(ev, somSelf->AcquireClipShape(ev, kNoBias));
  898.             _fWindowAggregateClipShape->SetGeometryMode(ev,mode);
  899.             if ( parent )
  900.             {
  901.                 TempODShape parentClip = kODNULL;
  902.                 TempODTransform xform = kODNULL;
  903.                 parentClip = ODCopyAndRelease(ev, parent->AcquireWindowAggregateClipShape(ev, kNoBias));
  904.                 xform = ODCopyAndRelease(ev, 
  905.                     parent->GetFrame(ev)->AcquireInternalTransform(ev, kODNULL));
  906.                 if ( _fExternalTransform != kODNULL )
  907.                     xform->PreCompose(ev, _fExternalTransform);
  908.                 parentClip->InverseTransform(ev, xform);
  909.                 _fWindowAggregateClipShape->Intersect(ev, parentClip);
  910.             }
  911.         }
  912.         return BiasShapeGet(ev, _fWindowAggregateClipShape, biasCanvas);
  913.     SOM_CATCH_ALL
  914.     SOM_ENDTRY
  915.     return kODNULL;
  916. }
  917.  
  918. //------------------------------------------------------------------------------
  919. // ODFacet: InvalidateAggregateClipShape
  920. //------------------------------------------------------------------------------
  921.  
  922. SOM_Scope void  SOMLINK ODFacetInvalidateAggregateClipShape(ODFacet *somSelf, Environment *ev)
  923. {
  924.     ODFacetData *somThis = ODFacetGetData(somSelf);
  925.     ODFacetMethodDebug("ODFacet","InvalidateAggregateClipShape");
  926.  
  927.     SOM_TRY
  928.         // flush aggregate clip shapes
  929.         ODReleaseObject(ev, _fAggregateClipShape);
  930.         ODReleaseObject(ev, _fWindowAggregateClipShape);
  931.         
  932.         // must flush cached border shape, as it is based on aggClipShape
  933.         if ( _fActiveBorderShape != kODNULL )
  934.             somSelf->InvalidateActiveBorder(ev);
  935.     
  936.         LinkedListIterator iter((LinkedList*)_fNode);
  937.         for (FacetNode* node = (FacetNode*) iter.First();
  938.                 iter.IsNotComplete();
  939.                 node = (FacetNode*) iter.Next())
  940.         {
  941.             node->GetFacet()->InvalidateAggregateClipShape(ev);
  942.         }
  943.         
  944.     SOM_CATCH_ALL
  945.     SOM_ENDTRY
  946. }
  947.  
  948. //------------------------------------------------------------------------------
  949. // ODFacet: AcquireActiveShape
  950. //------------------------------------------------------------------------------
  951.  
  952. SOM_Scope ODShape*  SOMLINK ODFacetAcquireActiveShape(ODFacet *somSelf, Environment *ev,
  953.         ODCanvas* biasCanvas)
  954. {
  955.     ODFacetData *somThis = ODFacetGetData(somSelf);
  956.     ODFacetMethodDebug("ODFacet","AcquireActiveShape");
  957.  
  958.     SOM_TRY
  959.         if ( _fActiveShape )
  960.             return BiasShapeGet(ev, _fActiveShape, biasCanvas);
  961.         else
  962.             return ODCopyAndRelease(ev, _fFrame->AcquireFrameShape(ev, biasCanvas));
  963.     SOM_CATCH_ALL
  964.     SOM_ENDTRY
  965.     return kODNULL;
  966. }
  967.  
  968. //------------------------------------------------------------------------------
  969. // ODFacet: ChangeActiveShape
  970. //------------------------------------------------------------------------------
  971.  
  972. SOM_Scope void  SOMLINK ODFacetChangeActiveShape(ODFacet *somSelf, Environment *ev,
  973.         ODShape* activeShape,
  974.         ODCanvas* biasCanvas)
  975. {
  976.     ODFacetData *somThis = ODFacetGetData(somSelf);
  977.     ODFacetMethodDebug("ODFacet","ChangeActiveShape");
  978.     
  979.     SOM_TRY
  980.         if ( _fActiveBorderShape != kODNULL )
  981.         {
  982.             somSelf->InvalidateActiveBorder(ev);
  983.             ODFacet* contFacet = somSelf->GetContainingFacet(ev);
  984.             if ( contFacet != kODNULL )
  985.             {
  986.                 TempODPart part = contFacet->GetFrame(ev)->AcquirePart(ev);
  987.                 part->AdjustBorderShape(ev, somSelf, kODNULL);
  988.             }
  989.         }
  990.         
  991.         ODAcquireObject(ev, activeShape);
  992.         ODReleaseObject(ev, _fActiveShape);
  993.         _fActiveShape = BiasShapeSet(ev, activeShape, biasCanvas);
  994.     
  995.     SOM_CATCH_ALL
  996.     SOM_ENDTRY
  997. }
  998.  
  999. //------------------------------------------------------------------------------
  1000. // ODFrame: CreateTransform
  1001. //------------------------------------------------------------------------------
  1002.  
  1003. SOM_Scope ODTransform*  SOMLINK ODFacetCreateTransform(ODFacet *somSelf, Environment *ev)
  1004. {
  1005.     ODFacetData *somThis = ODFacetGetData(somSelf);
  1006.     ODFacetMethodDebug("ODFacet","CreateTransform");
  1007.  
  1008.     ODTransform *t = kODNULL;  ODVolatile(t);
  1009.     
  1010.     SOM_TRY
  1011.         t = new ODTransform;
  1012.         THROW_IF_NULL(t);
  1013.         t->InitTransform(ev);
  1014.     SOM_CATCH_ALL
  1015.         ODDeleteObject(t);
  1016.         t = kODNULL;
  1017.     SOM_ENDTRY
  1018.     return t;
  1019. }
  1020.  
  1021. //------------------------------------------------------------------------------
  1022. // ODFacet: AcquireExternalTransform
  1023. //------------------------------------------------------------------------------
  1024.  
  1025. SOM_Scope ODTransform*  SOMLINK ODFacetAcquireExternalTransform(ODFacet *somSelf, Environment *ev,
  1026.         ODCanvas* biasCanvas)
  1027. {
  1028.     ODFacetData *somThis = ODFacetGetData(somSelf);
  1029.     ODFacetMethodDebug("ODFacet","AcquireExternalTransform");
  1030.  
  1031.     ODTransform* xform = kODNULL;
  1032.     
  1033.     SOM_TRY
  1034.         if ( _fExternalTransform != kODNULL )
  1035.             xform = _fExternalTransform;
  1036.         else
  1037.             xform = somSelf->CreateTransform(ev);
  1038.         return BiasTransformGet(ev, xform, biasCanvas);
  1039.     SOM_CATCH_ALL
  1040.     SOM_ENDTRY
  1041.     return kODNULL;
  1042. }
  1043.  
  1044. //------------------------------------------------------------------------------
  1045. // ODFacet: AcquireFrameTransform
  1046. //------------------------------------------------------------------------------
  1047.  
  1048. SOM_Scope ODTransform*  SOMLINK ODFacetAcquireFrameTransform(ODFacet *somSelf, Environment *ev,
  1049.         ODCanvas* biasCanvas)
  1050. {
  1051.     ODFacetData *somThis = ODFacetGetData(somSelf);
  1052.     ODFacetMethodDebug("ODFacet","AcquireFrameTransform");
  1053.  
  1054.     SOM_TRY
  1055.         ODFacet* parent = somSelf->GetContainingFacet(ev);
  1056.     
  1057.         if ( !_fFrameTransform )
  1058.         {
  1059.             if ( _fCanvas )
  1060.             {
  1061.                 if ( _fFrame->IsRoot(ev) && (_fExternalTransform != kODNULL) )
  1062.                     _fFrameTransform = _fExternalTransform->Copy(ev);
  1063.                 else
  1064.                     _fFrameTransform = somSelf->CreateTransform(ev);
  1065.             }
  1066.             else
  1067.             {
  1068.                 if ( _fExternalTransform != kODNULL )
  1069.                     _fFrameTransform = _fExternalTransform->Copy(ev);
  1070.                 else
  1071.                     _fFrameTransform = somSelf->CreateTransform(ev);
  1072.                 if ( parent )
  1073.                 {
  1074.                     TempODTransform xform = parent->AcquireContentTransform(ev, kODNULL);
  1075.                     _fFrameTransform->PostCompose(ev, xform);
  1076.                 }
  1077.             }
  1078.         }
  1079.         return BiasTransformGet(ev, _fFrameTransform, biasCanvas);
  1080.     SOM_CATCH_ALL
  1081.     SOM_ENDTRY
  1082.     return kODNULL;
  1083. }
  1084.  
  1085. //------------------------------------------------------------------------------
  1086. // ODFacet: AcquireContentTransform
  1087. //------------------------------------------------------------------------------
  1088.  
  1089. SOM_Scope ODTransform*  SOMLINK ODFacetAcquireContentTransform(ODFacet *somSelf, Environment *ev,
  1090.         ODCanvas* biasCanvas)
  1091. {
  1092.     ODFacetData *somThis = ODFacetGetData(somSelf);
  1093.     ODFacetMethodDebug("ODFacet","AcquireContentTransform");
  1094.  
  1095.     SOM_TRY
  1096.         if (!_fContentTransform)
  1097.         {
  1098.             _fContentTransform = ODCopyAndRelease(ev, _fFrame->AcquireInternalTransform(ev, kODNULL));
  1099.             TempODTransform xform = somSelf->AcquireFrameTransform(ev, kODNULL);
  1100.             _fContentTransform->PostCompose(ev, xform);
  1101.         }
  1102.         return BiasTransformGet(ev, _fContentTransform, biasCanvas);
  1103.     SOM_CATCH_ALL
  1104.     SOM_ENDTRY
  1105.     return kODNULL;
  1106. }
  1107.  
  1108. //------------------------------------------------------------------------------
  1109. // ODFacet: AcquireWindowFrameTransform
  1110. //------------------------------------------------------------------------------
  1111.  
  1112. SOM_Scope ODTransform*  SOMLINK ODFacetAcquireWindowFrameTransform(ODFacet *somSelf, Environment *ev,
  1113.         ODCanvas* biasCanvas)
  1114. {
  1115.     ODFacetData *somThis = ODFacetGetData(somSelf);
  1116.     ODFacetMethodDebug("ODFacet","AcquireWindowFrameTransform");
  1117.  
  1118.     SOM_TRY
  1119.         ODFacet* parent = somSelf->GetContainingFacet(ev);
  1120.     
  1121.         if (!_fWindowFrameTransform)
  1122.         {
  1123.             if ( _fExternalTransform != kODNULL )
  1124.                 _fWindowFrameTransform = _fExternalTransform->Copy(ev);
  1125.             else
  1126.                 _fWindowFrameTransform = somSelf->CreateTransform(ev);
  1127.             if (parent)
  1128.             {
  1129.                 TempODTransform xform = parent->AcquireWindowContentTransform(ev, kODNULL);
  1130.                 _fWindowFrameTransform->PostCompose(ev, xform);
  1131.             }
  1132.         }
  1133.         return BiasTransformGet(ev, _fWindowFrameTransform, biasCanvas);
  1134.     SOM_CATCH_ALL
  1135.     SOM_ENDTRY
  1136.     return kODNULL;
  1137. }
  1138.  
  1139. //------------------------------------------------------------------------------
  1140. // ODFacet: AcquireWindowContentTransform
  1141. //------------------------------------------------------------------------------
  1142.  
  1143. SOM_Scope ODTransform*  SOMLINK ODFacetAcquireWindowContentTransform(ODFacet *somSelf, Environment *ev,
  1144.         ODCanvas* biasCanvas)
  1145. {
  1146.     ODFacetData *somThis = ODFacetGetData(somSelf);
  1147.     ODFacetMethodDebug("ODFacet","AcquireWindowContentTransform");
  1148.  
  1149.     SOM_TRY
  1150.         if (!_fWindowContentTransform)
  1151.         {
  1152.             _fWindowContentTransform = ODCopyAndRelease(ev, _fFrame->AcquireInternalTransform(ev, kODNULL));
  1153.             TempODTransform xform = somSelf->AcquireWindowFrameTransform(ev, kODNULL);
  1154.             _fWindowContentTransform->PostCompose(ev, xform);
  1155.         }
  1156.         return BiasTransformGet(ev, _fWindowContentTransform, biasCanvas);
  1157.     SOM_CATCH_ALL
  1158.     SOM_ENDTRY
  1159.     return kODNULL;
  1160. }
  1161.  
  1162. //------------------------------------------------------------------------------
  1163. // ODFacet: InternalTransformChanged
  1164. //------------------------------------------------------------------------------
  1165.  
  1166. SOM_Scope void  SOMLINK ODFacetInternalTransformChanged(ODFacet *somSelf, Environment *ev)
  1167. {
  1168.     ODFacetData *somThis = ODFacetGetData(somSelf);
  1169.     ODFacetMethodDebug("ODFacet","InternalTransformChanged");
  1170.  
  1171.     ODFacetIterator* facets = kODNULL;    ODVolatile(facets);
  1172.     ODFacet* facet = kODNULL;
  1173.     
  1174.     SOM_TRY
  1175.         ODReleaseObject(ev, _fContentTransform);
  1176.         ODReleaseObject(ev, _fWindowContentTransform);
  1177.         
  1178.         // invalidate children
  1179.         LinkedListIterator iter((LinkedList*)_fNode);
  1180.         for (FacetNode* node = (FacetNode*) iter.First();
  1181.                 iter.IsNotComplete();
  1182.                 node = (FacetNode*) iter.Next())
  1183.         {
  1184.             node->GetFacet()->InvalidateAggregateClipShape(ev);
  1185.             node->GetFacet()->InvalidateAggregateTransforms(ev);
  1186.         }
  1187.         
  1188.         facets = somSelf->CreateFacetIterator(ev, kODTopDown, kODFrontToBack);
  1189.         for ( facet = facets->First(ev);
  1190.                 facets->IsNotComplete(ev);
  1191.                 facet = facets->Next(ev) )
  1192.         {
  1193.             TempODPart tempPart = facet->GetFrame(ev)->AcquirePart(ev);
  1194.             tempPart->GeometryChanged(ev, facet, kODFalse, kODTrue);
  1195.         }
  1196.         ODDeleteObject(facets);
  1197.         
  1198.     SOM_CATCH_ALL
  1199.         ODDeleteObject(facets);
  1200.     SOM_ENDTRY
  1201. }
  1202.  
  1203. //------------------------------------------------------------------------------
  1204. // ODFacet: InvalidateAggregateTransforms
  1205. //------------------------------------------------------------------------------
  1206.  
  1207. SOM_Scope void  SOMLINK ODFacetInvalidateAggregateTransforms(ODFacet *somSelf, Environment *ev)
  1208. {
  1209.     ODFacetData *somThis = ODFacetGetData(somSelf);
  1210.     ODFacetMethodDebug("ODFacet","InvalidateAggregateTransforms");
  1211.  
  1212.     SOM_TRY
  1213.         ODReleaseObject(ev, _fFrameTransform);
  1214.         ODReleaseObject(ev, _fContentTransform);
  1215.         ODReleaseObject(ev, _fWindowFrameTransform);
  1216.         ODReleaseObject(ev, _fWindowContentTransform);
  1217.     
  1218.         // invalidate children
  1219.         LinkedListIterator iter((LinkedList*)_fNode);
  1220.         for (FacetNode* node = (FacetNode*) iter.First();
  1221.                 iter.IsNotComplete();
  1222.                 node = (FacetNode*) iter.Next())
  1223.         {
  1224.             node->GetFacet()->InvalidateAggregateTransforms(ev);
  1225.         }
  1226.     SOM_CATCH_ALL
  1227.     SOM_ENDTRY
  1228. }
  1229.  
  1230. //------------------------------------------------------------------------------
  1231. // ODFacet: CreateCanvas
  1232. //------------------------------------------------------------------------------
  1233.  
  1234. SOM_Scope ODCanvas*  SOMLINK ODFacetCreateCanvas(ODFacet *somSelf, Environment *ev,
  1235.         ODGraphicsSystem graphicsSystem,
  1236.         ODPlatformCanvas platformCanvas,
  1237.         ODBoolean isDynamic,
  1238.         ODBoolean isOffscreen)
  1239. {
  1240.     ODFacetData *somThis = ODFacetGetData(somSelf);
  1241.     ODFacetMethodDebug("ODFacet","CreateCanvas");
  1242.     
  1243.     ODCanvas *c = kODNULL;  ODVolatile(c);
  1244.     
  1245.     SOM_TRY
  1246.         c = new ODCanvas;
  1247.         THROW_IF_NULL(c);
  1248.         c->InitCanvas(ev, graphicsSystem,platformCanvas,isDynamic,isOffscreen);
  1249.     SOM_CATCH_ALL
  1250.         ODDeleteObject(c);
  1251.         c = kODNULL;
  1252.     SOM_ENDTRY
  1253.     return c;
  1254. }
  1255.  
  1256. //------------------------------------------------------------------------------
  1257. // ODFacet: HasCanvas
  1258. //------------------------------------------------------------------------------
  1259.  
  1260. SOM_Scope ODBoolean  SOMLINK ODFacetHasCanvas(ODFacet *somSelf, Environment *ev)
  1261. {
  1262.     ODFacetData *somThis = ODFacetGetData(somSelf);
  1263.     ODFacetMethodDebug("ODFacet","HasCanvas");
  1264.  
  1265.     return (_fCanvas != kODNULL);
  1266. }
  1267.  
  1268. //------------------------------------------------------------------------------
  1269. // ODFacet: GetCanvas
  1270. //------------------------------------------------------------------------------
  1271.  
  1272. SOM_Scope ODCanvas*  SOMLINK ODFacetGetCanvas(ODFacet *somSelf, Environment *ev)
  1273. {
  1274.     ODFacetData *somThis = ODFacetGetData(somSelf);
  1275.     ODFacetMethodDebug("ODFacet","GetCanvas");
  1276.  
  1277.     SOM_TRY
  1278.         if (_fCanvas)
  1279.             return _fCanvas;
  1280.         else
  1281.         {
  1282.             ODFacet* parent = somSelf->GetContainingFacet(ev);
  1283.             if (parent)
  1284.                 return parent->GetCanvas(ev);
  1285.             else
  1286.                 THROW(kODErrCanvasNotFound);
  1287.         }
  1288.     SOM_CATCH_ALL
  1289.     SOM_ENDTRY
  1290.     return kODNULL;
  1291. }
  1292.  
  1293. SOM_Scope void  SOMLINK ODFacetChangeCanvas(ODFacet *somSelf, Environment *ev,
  1294.         ODCanvas* canvas)
  1295. {
  1296.     ODFacetData *somThis = ODFacetGetData(somSelf);
  1297.     ODFacetMethodDebug("ODFacet","ChangeCanvas");
  1298.  
  1299.     // I don't manage storage for the canvas - that's up to my part!
  1300.  
  1301.     ODFacetIterator* i = kODNULL;    ODVolatile(i);
  1302.     SOM_TRY
  1303.         if ( canvas != kODNULL )
  1304.         {
  1305.             TempODPart owner = canvas->AcquireOwner(ev);
  1306.             if ( (ODPart*)owner == kODNULL )
  1307.                 THROW(kODErrCanvasHasNoOwner);
  1308.         }
  1309.  
  1310.         i = new ODFacetIterator();
  1311.         THROW_IF_NULL(i);
  1312.         i->InitFacetIterator(ev, somSelf, kODTopDown, kODBackToFront);
  1313.     
  1314.         if ( _fCanvas )
  1315.             _fCanvas->SetFacet(ev, kODNULL);
  1316.         _fCanvas = canvas;
  1317.         if ( _fCanvas )
  1318.         {
  1319.             _fCanvas->SetFacet(ev, somSelf);        // point back to this facet
  1320.             TempODShape tempShape = _fFrame->AcquireFrameShape(ev, kODNULL);
  1321.             _fCanvas->Invalidate(ev, tempShape); // contents are initially invalid
  1322.         }
  1323.         
  1324.         somSelf->InvalidateAggregateClipShape(ev);
  1325.         somSelf->InvalidateAggregateTransforms(ev);
  1326.  
  1327.         ODBoolean notFirst = kODFalse;
  1328.         for (ODFacet* facet = i->First(ev); i->IsNotComplete(ev); facet = i->Next(ev))
  1329.         {
  1330.             if ( notFirst && facet->HasCanvas(ev) )
  1331.                 i->SkipChildren(ev);
  1332.             else
  1333.             {
  1334.                 TempODPart tempPart = facet->GetFrame(ev)->AcquirePart(ev);
  1335.                 tempPart->CanvasChanged(ev, somSelf);
  1336.             }
  1337.             notFirst = kODTrue;
  1338.         }
  1339.         ODDeleteObject(i);
  1340.     SOM_CATCH_ALL
  1341.         ODDeleteObject(i);
  1342.     SOM_ENDTRY
  1343. }
  1344.  
  1345. //------------------------------------------------------------------------------
  1346. // ODFacet: GetWindow
  1347. //------------------------------------------------------------------------------
  1348.  
  1349. SOM_Scope ODWindow*  SOMLINK ODFacetGetWindow(ODFacet *somSelf, Environment *ev)
  1350. {
  1351.     ODFacetData *somThis = ODFacetGetData(somSelf);
  1352.     ODFacetMethodDebug("ODFacet","GetWindow");
  1353.  
  1354.     // this method returns fFrame's window.  getting the window from fFrame
  1355.     // automatically increments the window's refcount, but because the window
  1356.     // in an invariant of the facet we don't want to increment the refcount.
  1357.     // so after getting the window from the frame, release it to restore its
  1358.     // original refcount.
  1359.  
  1360.     ODWindow* window = kODNULL;
  1361.  
  1362.     SOM_TRY
  1363.         window = _fFrame->AcquireWindow(ev);
  1364.         if (window)
  1365.             window->Release(ev); // undo ref bump from frame->AcquireWindow;
  1366.         return window;
  1367.     SOM_CATCH_ALL
  1368.     SOM_ENDTRY
  1369.     return kODNULL;
  1370. }
  1371.  
  1372. //------------------------------------------------------------------------------
  1373. // ODFacet: GetPartInfo
  1374. //------------------------------------------------------------------------------
  1375.  
  1376. SOM_Scope ODInfoType  SOMLINK ODFacetGetPartInfo(ODFacet *somSelf, Environment *ev)
  1377. {
  1378.     ODFacetData *somThis = ODFacetGetData(somSelf);
  1379.     ODFacetMethodDebug("ODFacet","GetPartInfo");
  1380.  
  1381.     return _fPartInfo;
  1382. }
  1383.  
  1384. SOM_Scope void  SOMLINK ODFacetSetPartInfo(ODFacet *somSelf, Environment *ev,
  1385.         ODInfoType partInfo)
  1386. {
  1387.     ODFacetData *somThis = ODFacetGetData(somSelf);
  1388.     ODFacetMethodDebug("ODFacet","SetPartInfo");
  1389.  
  1390.     _fPartInfo = partInfo;
  1391. }
  1392.  
  1393. //------------------------------------------------------------------------------
  1394. // ODFacet: DragEnter
  1395. //------------------------------------------------------------------------------
  1396.  
  1397. SOM_Scope ODDragResult  SOMLINK ODFacetDragEnter(ODFacet *somSelf, Environment *ev,
  1398.         ODPoint* point,
  1399.         ODDragItemIterator* dragInfo,
  1400.         ODCanvas* biasCanvas)
  1401. {
  1402.     ODFacetData *somThis = ODFacetGetData(somSelf);
  1403.     ODFacetMethodDebug("ODFacet","DragEnter");
  1404.  
  1405.     SOM_TRY
  1406.         ODPoint bPoint = BiasPointSet(ev, point, biasCanvas);
  1407.         TempODTransform xform = somSelf->AcquireWindowFrameTransform(ev, kODNULL);
  1408.         xform->InvertPoint(ev, &bPoint);
  1409.         TempODPart tempPart = _fFrame->AcquirePart(ev);
  1410.         return tempPart->DragEnter(ev, dragInfo, somSelf, &bPoint);
  1411.     SOM_CATCH_ALL
  1412.     SOM_ENDTRY
  1413.     return kODFalse;
  1414. }
  1415.  
  1416. //------------------------------------------------------------------------------
  1417. // ODFacet: DragWithin
  1418. //------------------------------------------------------------------------------
  1419.  
  1420. SOM_Scope ODDragResult  SOMLINK ODFacetDragWithin(ODFacet *somSelf, Environment *ev,
  1421.         ODPoint* point,
  1422.         ODDragItemIterator* dragInfo,
  1423.         ODCanvas* biasCanvas)
  1424. {
  1425.     ODFacetData *somThis = ODFacetGetData(somSelf);
  1426.     ODFacetMethodDebug("ODFacet","DragWithin");
  1427.  
  1428.     SOM_TRY
  1429.         ODPoint bPoint = BiasPointSet(ev, point, biasCanvas);
  1430.         TempODTransform xform = somSelf->AcquireWindowFrameTransform(ev, kODNULL);
  1431.         xform->InvertPoint(ev, &bPoint);
  1432.         TempODPart tempPart = _fFrame->AcquirePart(ev);
  1433.         return tempPart->DragWithin(ev, dragInfo, somSelf, &bPoint);
  1434.     SOM_CATCH_ALL
  1435.     SOM_ENDTRY
  1436.     return kODFalse;
  1437. }
  1438.  
  1439. //------------------------------------------------------------------------------
  1440. // ODFacet: DragLeave
  1441. //------------------------------------------------------------------------------
  1442.  
  1443. SOM_Scope void  SOMLINK ODFacetDragLeave(ODFacet *somSelf, Environment *ev,
  1444.         ODPoint* point,
  1445.         ODCanvas* biasCanvas)
  1446. {
  1447.     ODFacetData *somThis = ODFacetGetData(somSelf);
  1448.     ODFacetMethodDebug("ODFacet","DragLeave");
  1449.  
  1450.     SOM_TRY
  1451.         ODPoint bPoint = BiasPointSet(ev, point, biasCanvas);
  1452.         TempODTransform xform = somSelf->AcquireWindowFrameTransform(ev, kODNULL);
  1453.         xform->InvertPoint(ev, &bPoint);
  1454.         TempODPart tempPart = _fFrame->AcquirePart(ev);
  1455.         tempPart->DragLeave(ev, somSelf, &bPoint);
  1456.     SOM_CATCH_ALL
  1457.     SOM_ENDTRY
  1458. }
  1459.  
  1460. //------------------------------------------------------------------------------
  1461. // ODFacet: Drop
  1462. //------------------------------------------------------------------------------
  1463.  
  1464. SOM_Scope ODDropResult  SOMLINK ODFacetDrop(ODFacet *somSelf, Environment *ev,
  1465.         ODPoint* point,
  1466.         ODDragItemIterator* dropInfo,
  1467.         ODCanvas* biasCanvas)
  1468. {
  1469.     ODFacetData *somThis = ODFacetGetData(somSelf);
  1470.     ODFacetMethodDebug("ODFacet","Drop");
  1471.  
  1472.     SOM_TRY
  1473.         ODPoint bPoint = BiasPointSet(ev, point, biasCanvas);
  1474.         TempODTransform xform = somSelf->AcquireWindowFrameTransform(ev, kODNULL);
  1475.         xform->InvertPoint(ev, &bPoint);
  1476.         TempODPart tempPart = _fFrame->AcquirePart(ev);
  1477.         return tempPart->Drop(ev, dropInfo, somSelf, &bPoint);
  1478.     SOM_CATCH_ALL
  1479.     SOM_ENDTRY
  1480.     return kODDropFail;
  1481. }
  1482.  
  1483. //------------------------------------------------------------------------------
  1484. // ODFacet: Update
  1485. //------------------------------------------------------------------------------
  1486.  
  1487. SOM_Scope void  SOMLINK ODFacetUpdate(ODFacet *somSelf, Environment *ev,
  1488.         ODShape* invalidShape,
  1489.         ODCanvas* biasCanvas)
  1490. {
  1491.     ODFacetData *somThis = ODFacetGetData(somSelf);
  1492.     ODFacetMethodDebug("ODFacet","Update");
  1493.  
  1494.     ODFacet*        facet = kODNULL;
  1495.     ODBoolean        notFirst = kODFalse;
  1496.     
  1497.     SOM_TRY
  1498.         _fIsUpdating = kODTrue;
  1499.         
  1500.         TempODShape bShape = kODNULL;
  1501.         if ( invalidShape == kODNULL )
  1502.             bShape = ODCopyAndRelease(ev, _fFrame->AcquireFrameShape(ev, kODNULL));
  1503.         else
  1504.             bShape = BiasShapeSet(ev, invalidShape->Copy(ev), biasCanvas);
  1505.         
  1506.         // transform bShape into window coords for intersection with
  1507.         // shapes of embedded facets
  1508.         TempODTransform wfXform = somSelf->AcquireWindowFrameTransform(ev, kODNULL);
  1509.         bShape->Transform(ev, wfXform);
  1510.         
  1511.         ODFacetIterator* i = new ODFacetIterator();
  1512.         THROW_IF_NULL(i);
  1513.         i->InitFacetIterator(ev, somSelf, kODTopDown, kODBackToFront);
  1514.         for (facet = i->First(ev); i->IsNotComplete(ev); facet = i->Next(ev))
  1515.         {
  1516.             TempODShape aggClipShape = facet->AcquireAggregateClipShape(ev, kODNULL);
  1517.             TempODShape testShape = aggClipShape->Copy(ev);
  1518.             TempODTransform xform = facet->AcquireWindowFrameTransform(ev, kODNULL);
  1519.             testShape->Transform(ev, xform);
  1520.             // both bShape and testShape are now in window coords
  1521.             testShape->Intersect(ev, bShape);
  1522.             if ( testShape->IsEmpty(ev) )
  1523.                 i->SkipChildren(ev);
  1524.             else
  1525.             {
  1526.                 facet->SetNeedsUpdate(ev, kODTrue);
  1527.                 
  1528.                 // if facet has its own canvas, and facet is not the root facet,
  1529.                 // let the facet handle updating its children
  1530.                 if ( facet->HasCanvas(ev) && notFirst )
  1531.                     i->SkipChildren(ev);
  1532.             }
  1533.             notFirst = kODTrue;
  1534.         }
  1535.         
  1536.         for (facet = i->First(ev); i->IsNotComplete(ev); facet = i->Next(ev))
  1537.         {
  1538.             if ( facet->NeedsUpdate(ev) )
  1539.             {
  1540.                 TempODShape testShape = bShape->Copy(ev);
  1541.                 TempODTransform xform = facet->AcquireWindowFrameTransform(ev, kODNULL);
  1542.                 testShape->InverseTransform(ev, xform);
  1543.                 facet->Draw(ev, testShape, kODNULL);
  1544.             }
  1545.             else
  1546.                 i->SkipChildren(ev);
  1547.         }
  1548.     
  1549.         _fIsUpdating = kODFalse;
  1550.     
  1551.         delete i;
  1552.     SOM_CATCH_ALL
  1553.     SOM_ENDTRY
  1554. }
  1555.  
  1556. //------------------------------------------------------------------------------
  1557. // ODFacet: Invalidate
  1558. //------------------------------------------------------------------------------
  1559.  
  1560. SOM_Scope void  SOMLINK ODFacetInvalidate(ODFacet *somSelf, Environment *ev,
  1561.         ODShape* invalidShape,
  1562.         ODCanvas* biasCanvas)
  1563. {
  1564.     ODFacetData *somThis = ODFacetGetData(somSelf);
  1565.     ODFacetMethodDebug("ODFacet","Invalidate");
  1566.  
  1567.     //    Assumes invalidShape is in frame coordinates.
  1568.     
  1569.     ODCanvas* myCanvas = kODNULL;
  1570.     ODFacet* myCanvasFacet = kODNULL;
  1571.     ODFacet* myContainingFacet = kODNULL;
  1572.     ODFacet* parentCanvasFacet = kODNULL;
  1573.  
  1574.     SOM_TRY
  1575.         ODWindow* window = somSelf->GetWindow(ev);
  1576.         if( !window )
  1577.             return;
  1578.         
  1579.         TempODShape tShape = ODCopyAndRelease(ev, somSelf->AcquireAggregateClipShape(ev, kODNULL));
  1580.         if ( invalidShape )
  1581.         {
  1582.             TempODShape bShape = BiasShapeSet(ev, invalidShape->Copy(ev), biasCanvas);
  1583.             tShape->Intersect(ev, bShape);
  1584.         }
  1585.         
  1586.         if( !tShape->IsEmpty(ev) )
  1587.         {
  1588.             myCanvas = somSelf->GetCanvas(ev);
  1589.             
  1590.             TempODTransform xf1 = somSelf->AcquireFrameTransform(ev, kODNULL);
  1591.             tShape->Transform(ev, xf1);
  1592.             myCanvas->Invalidate(ev, tShape);
  1593.             tShape->InverseTransform(ev, xf1);
  1594.  
  1595.             if ( myCanvas->IsOffscreen(ev) )
  1596.             {
  1597.                 myCanvasFacet = myCanvas->GetFacet(ev);
  1598.                 myContainingFacet = myCanvasFacet->GetContainingFacet(ev);
  1599.                 if ( myContainingFacet )
  1600.                     parentCanvasFacet = myContainingFacet->GetCanvas(ev)->GetFacet(ev);
  1601.                 else
  1602.                     THROW(kODErrFacetNotFound);
  1603.             
  1604.                 TempODTransform xf2 = somSelf->AcquireWindowFrameTransform(ev, kODNULL);
  1605.                 tShape->Transform(ev, xf2);
  1606.                 TempODTransform xf3 = parentCanvasFacet->AcquireWindowFrameTransform(ev, kODNULL);
  1607.                 tShape->InverseTransform(ev, xf3);
  1608.                 parentCanvasFacet->Invalidate(ev, tShape, kODNULL);
  1609.             }
  1610.         }
  1611.     SOM_CATCH_ALL
  1612.     SOM_ENDTRY
  1613. }
  1614.  
  1615. //------------------------------------------------------------------------------
  1616. // ODFacet: Validate
  1617. //------------------------------------------------------------------------------
  1618.  
  1619. SOM_Scope void  SOMLINK ODFacetValidate(ODFacet *somSelf, Environment *ev,
  1620.         ODShape* validShape,
  1621.         ODCanvas* biasCanvas)
  1622. {
  1623.     ODFacetData *somThis = ODFacetGetData(somSelf);
  1624.     ODFacetMethodDebug("ODFacet","Validate");
  1625.  
  1626.     //    Assumes validShape is in frame coordinates.
  1627.     
  1628.     ODCanvas* myCanvas = kODNULL;
  1629.     ODTransform* xform = kODNULL;
  1630.  
  1631.     SOM_TRY
  1632.         ODWindow* window = somSelf->GetWindow(ev);
  1633.         if( !window )
  1634.             return;
  1635.         
  1636.         TempODShape tShape = ODCopyAndRelease(ev, somSelf->AcquireAggregateClipShape(ev, kODNULL));
  1637.         if ( validShape )
  1638.         {
  1639.             TempODShape bShape = BiasShapeSet(ev, validShape->Copy(ev), biasCanvas);
  1640.             tShape->Intersect(ev, bShape);
  1641.         }    
  1642.         
  1643.         if( !tShape->IsEmpty(ev) )
  1644.         {
  1645.             myCanvas = somSelf->GetCanvas(ev);
  1646.  
  1647.             TempODTransform xform = somSelf->AcquireFrameTransform(ev, kODNULL);
  1648.             tShape->Transform(ev, xform);
  1649.             myCanvas->Validate(ev, tShape);
  1650.         }
  1651.     SOM_CATCH_ALL
  1652.     SOM_ENDTRY
  1653. }
  1654.  
  1655. //------------------------------------------------------------------------------
  1656. // ODFacet: Draw
  1657. //------------------------------------------------------------------------------
  1658.  
  1659. SOM_Scope void  SOMLINK ODFacetDraw(ODFacet *somSelf, Environment *ev,
  1660.         ODShape* invalidShape,
  1661.         ODCanvas* biasCanvas)
  1662. {
  1663.     ODFacetData *somThis = ODFacetGetData(somSelf);
  1664.     ODFacetMethodDebug("ODFacet","Draw");
  1665.  
  1666.     SOM_TRY
  1667.         TempODShape bShape = kODNULL;
  1668.         if ( invalidShape == kODNULL )
  1669.             bShape = ODCopyAndRelease(ev, _fFrame->AcquireFrameShape(ev, kODNULL));
  1670.         else
  1671.             bShape = BiasShapeSet(ev, invalidShape->Copy(ev), biasCanvas);
  1672.     
  1673.         if ( _fCanvas && !_fIsUpdating && _fCanvas->IsOffscreen(ev) )
  1674.         {
  1675.             // repair canvas if needs updating
  1676.             TempODShape testShape = bShape->Copy(ev);
  1677.             TempODShape updateShape = _fCanvas->AcquireUpdateShape(ev);
  1678.             testShape->Intersect(ev, updateShape);
  1679.     
  1680.             if ( !testShape->IsEmpty(ev) )
  1681.             {
  1682.                 // fix offscreen canvas
  1683.                 somSelf->Update(ev, bShape, kODNULL);
  1684.             }
  1685.             
  1686.             // tell canvas owner part to copy pixels
  1687.             TempODPart owner = _fCanvas->AcquireOwner(ev);
  1688.             owner->CanvasUpdated(ev, _fCanvas);
  1689.         }
  1690.         else
  1691.         {
  1692.             TempODPart tempPart = _fFrame->AcquirePart(ev);
  1693.             tempPart->Draw(ev, somSelf, bShape);
  1694.         }
  1695.         _fNeedsUpdate = kODFalse;
  1696.     SOM_CATCH_ALL
  1697.     SOM_ENDTRY
  1698. }
  1699.  
  1700. //------------------------------------------------------------------------------
  1701. // ODFacet: DrawChildren
  1702. //------------------------------------------------------------------------------
  1703.  
  1704. SOM_Scope void  SOMLINK ODFacetDrawChildren(ODFacet *somSelf, Environment *ev,
  1705.         ODShape* invalidShape,
  1706.         ODCanvas* biasCanvas)
  1707. {
  1708.     ODFacetData *somThis = ODFacetGetData(somSelf);
  1709.     ODFacetMethodDebug("ODFacet","DrawChildren");
  1710.     
  1711.     SOM_TRY
  1712.         TempODShape bShape = kODNULL;
  1713.         if ( invalidShape == kODNULL )
  1714.             bShape = ODCopyAndRelease(ev, _fFrame->AcquireFrameShape(ev, kODNULL));
  1715.         else
  1716.             bShape = BiasShapeSet(ev, invalidShape->Copy(ev), biasCanvas);
  1717.         TempODTransform xform = somSelf->AcquireWindowFrameTransform(ev, kODNULL);
  1718.         bShape->Transform(ev, xform);
  1719.     
  1720.         ODFacetIterator* i = new ODFacetIterator;
  1721.         THROW_IF_NULL(i);
  1722.         i->InitFacetIterator(ev, somSelf, kODChildrenOnly, kODBackToFront);
  1723.     
  1724.         for ( ODFacet* child = i->First(ev); i->IsNotComplete(ev); child = i->Next(ev) )
  1725.         {
  1726.             if ( child->NeedsUpdate(ev) )
  1727.             {
  1728.                 TempODTransform xf2 = child->AcquireWindowFrameTransform(ev, kODNULL);
  1729.                 TempODShape tempShape = bShape->Copy(ev);
  1730.                 tempShape->InverseTransform(ev, xf2);
  1731.                 child->Draw(ev, tempShape, kODNULL);
  1732.                 child->DrawChildren(ev, tempShape, kODNULL);
  1733.             }
  1734.         }
  1735.         ODDeleteObject(i);
  1736.     SOM_CATCH_ALL
  1737.     SOM_ENDTRY
  1738. }
  1739.  
  1740. //------------------------------------------------------------------------------
  1741. // ODFacet: DrawChildrenAlways
  1742. //------------------------------------------------------------------------------
  1743.  
  1744. SOM_Scope void  SOMLINK ODFacetDrawChildrenAlways(ODFacet *somSelf, Environment *ev,
  1745.         ODShape* invalidShape,
  1746.         ODCanvas* biasCanvas)
  1747. {
  1748.     ODFacetData *somThis = ODFacetGetData(somSelf);
  1749.     ODFacetMethodDebug("ODFacet","DrawChildrenAlways");
  1750.  
  1751.     SOM_TRY
  1752.         TempODShape bShape = kODNULL;
  1753.         if ( invalidShape == kODNULL )
  1754.             bShape = ODCopyAndRelease(ev, _fFrame->AcquireFrameShape(ev, kODNULL));
  1755.         else
  1756.             bShape = BiasShapeSet(ev, invalidShape->Copy(ev), biasCanvas);
  1757.         TempODTransform xf1 = somSelf->AcquireWindowFrameTransform(ev, kODNULL);
  1758.         bShape->Transform(ev, xf1);
  1759.     
  1760.         ODFacetIterator* i = new ODFacetIterator;
  1761.         THROW_IF_NULL(i);
  1762.         i->InitFacetIterator(ev, somSelf, kODChildrenOnly, kODBackToFront);
  1763.     
  1764.         for ( ODFacet* child = i->First(ev); i->IsNotComplete(ev); child = i->Next(ev) )
  1765.         {
  1766.             TempODTransform xf2 = child->AcquireWindowFrameTransform(ev, kODNULL);
  1767.             TempODShape tempShape = bShape->Copy(ev);
  1768.             tempShape->InverseTransform(ev, xf2);
  1769.             child->Draw(ev, tempShape, kODNULL);
  1770.             child->DrawChildrenAlways(ev, tempShape, kODNULL);
  1771.         }
  1772.         ODDeleteObject(i);
  1773.     SOM_CATCH_ALL
  1774.     SOM_ENDTRY
  1775. }
  1776.  
  1777. //------------------------------------------------------------------------------
  1778. // ODFacet: InvalidateActiveBorder
  1779. //------------------------------------------------------------------------------
  1780. SOM_Scope void  SOMLINK ODFacetInvalidateActiveBorder(ODFacet *somSelf, Environment *ev)
  1781. {
  1782.     ODFacetData *somThis = ODFacetGetData(somSelf);
  1783.     ODFacetMethodDebug("ODFacet","InvalidateActiveBorder");
  1784.  
  1785.     SOM_TRY
  1786.         if ( _fActiveBorderShape != kODNULL )
  1787.         {
  1788.             ODInvalidateBorder(ev, _fActiveBorderShape, somSelf);
  1789.             ODReleaseObject(ev, _fActiveBorderShape);
  1790.         }
  1791.     SOM_CATCH_ALL
  1792.     SOM_ENDTRY
  1793. }
  1794.  
  1795. //------------------------------------------------------------------------------
  1796. // ODFacet: DrawActiveBorder
  1797. //------------------------------------------------------------------------------
  1798. SOM_Scope void  SOMLINK ODFacetDrawActiveBorder(ODFacet *somSelf, Environment *ev)
  1799. {
  1800.     ODFacetData *somThis = ODFacetGetData(somSelf);
  1801.     ODFacetMethodDebug("ODFacet","DrawActiveBorder");
  1802.  
  1803.     SOM_TRY
  1804.         ODFacet* contFacet = kODNULL;
  1805.         TempODPart contPart = kODNULL;
  1806.         TempODShape border = kODNULL;
  1807.         TempODShape scratch = kODNULL;
  1808.         TempODShape adjusted = kODNULL;
  1809.         TempODShape clip = kODNULL;
  1810.         TempODTransform xform = kODNULL;
  1811.         TempODTransform xform2 = kODNULL;
  1812.         TempODTransform xform3 = kODNULL;
  1813.     
  1814.         if ( _fActiveBorderShape == kODNULL )
  1815.         {
  1816.             // compute border shape
  1817.             contFacet = somSelf->GetContainingFacet(ev);
  1818.             if ( contFacet )
  1819.             {
  1820.                 contPart = contFacet->GetFrame(ev)->AcquirePart(ev);
  1821.                 border = ODCopyAndRelease(ev, somSelf->AcquireActiveShape(ev, kNoBias));
  1822.                 xform = somSelf->AcquireWindowFrameTransform(ev, kNoBias);
  1823.                 xform2 = contFacet->AcquireWindowFrameTransform(ev, kNoBias);
  1824.                 border->Transform(ev, xform);
  1825.                 border->SetGeometryMode(ev, kODLoseGeometry);
  1826.                 scratch = border->Copy(ev);
  1827.                 
  1828.                 border->Outset(ev, ODIntToFixed(4));
  1829.                 border->Subtract(ev, scratch);
  1830.                 ODReleaseObject(ev, scratch);
  1831.                 
  1832.                 border->InverseTransform(ev, xform);
  1833.                 adjusted = contPart->AdjustBorderShape(ev, somSelf, border);
  1834.                 THROW_IF_NULL(adjusted);
  1835.                 ODReleaseObject(ev, border);
  1836.                 
  1837.                 if ( adjusted->IsEmpty(ev) )
  1838.                 {
  1839.                     // compute as inset
  1840.                     scratch = ODCopyAndRelease(ev, contFacet->GetFrame(ev)->AcquireUsedShape(ev, kNoBias));
  1841.                     scratch->Transform(ev, xform2);
  1842.                     border = ODCopyAndRelease(ev, somSelf->AcquireActiveShape(ev, kNoBias));
  1843.                     border->Transform(ev, xform);
  1844.                     border->Subtract(ev, scratch);
  1845.                     if ( !border->IsEmpty(ev) )
  1846.                     {
  1847.                         ODReleaseObject(ev, adjusted);
  1848.                         ODReleaseObject(ev, border);
  1849.                         border = scratch->Copy(ev);
  1850.                         scratch->Outset(ev, ODIntToFixed(-4));
  1851.                         border->Subtract(ev, scratch);
  1852.                         ODReleaseObject(ev, scratch);
  1853.                         
  1854.                         border->InverseTransform(ev, xform);
  1855.                         adjusted = contPart->AdjustBorderShape(ev, somSelf, border);
  1856.                         THROW_IF_NULL(adjusted);
  1857.                         ODReleaseObject(ev, border);
  1858.                     }
  1859.                     else
  1860.                     {
  1861.                         ODReleaseObject(ev, border);
  1862.                         ODReleaseObject(ev, scratch);
  1863.                     }
  1864.                 }
  1865.                 
  1866.                 // clip to containing facet's visible area
  1867.                 clip = ODCopyAndRelease(ev,
  1868.                     contFacet->AcquireWindowAggregateClipShape(ev, kNoBias));
  1869.                 xform3 = ODCopyAndRelease(ev, 
  1870.                     contFacet->GetFrame(ev)->AcquireInternalTransform(ev, kNoBias));
  1871.                 if ( _fExternalTransform != kODNULL )
  1872.                     xform3->PreCompose(ev, _fExternalTransform);
  1873.                 clip->InverseTransform(ev, xform3);
  1874.                 adjusted->Intersect(ev, clip);
  1875.                 
  1876.                 adjusted->Transform(ev, xform);
  1877.                 adjusted->Acquire(ev);    // because TempODShape releases on scope exit
  1878.                 _fActiveBorderShape = adjusted;
  1879.             }
  1880.         }
  1881.         
  1882.         ODWindow* window = somSelf->GetWindow(ev);
  1883.         if ( _fActiveBorderShape && window && window->IsShown(ev) )
  1884.         {
  1885.             ODDrawBorder(ev, _fActiveBorderShape, somSelf);
  1886.         }
  1887.     SOM_CATCH_ALL
  1888.     SOM_ENDTRY
  1889. }
  1890.  
  1891. //------------------------------------------------------------------------------
  1892. // ODFacet: DrawnIn
  1893. //------------------------------------------------------------------------------
  1894.  
  1895. SOM_Scope void  SOMLINK ODFacetDrawnIn(ODFacet *somSelf, Environment *ev,
  1896.         ODShape* shape,
  1897.         ODCanvas* biasCanvas)
  1898. {
  1899.     ODFacetData *somThis = ODFacetGetData(somSelf);
  1900.     ODFacetMethodDebug("ODFacet","DrawnIn");
  1901.  
  1902.     // invalidate shape on my parent canvas to ensure that changed
  1903.     // pixels get copied to it.
  1904.     
  1905.     ODCanvas* myCanvas = kODNULL;
  1906.     ODFacet* myCanvasFacet = kODNULL;
  1907.     ODFacet* containingFacet = kODNULL;
  1908.     ODFacet* parentCanvasFacet = kODNULL;
  1909.  
  1910.     SOM_TRY
  1911.         // since the shape has been drawn in, it can now be marked as valid
  1912.         somSelf->Validate(ev, shape, biasCanvas);
  1913.         
  1914.         myCanvas = somSelf->GetCanvas(ev);
  1915.     
  1916.         // don't need to worry about on-screen canvas - it's the window
  1917.         if ( !myCanvas->IsOffscreen(ev) )
  1918.             return;
  1919.     
  1920.         TempODShape tShape = ODCopyAndRelease(ev, somSelf->AcquireAggregateClipShape(ev, kODNULL));
  1921.         if ( shape )
  1922.         {
  1923.             TempODShape bShape = BiasShapeSet(ev, shape->Copy(ev), biasCanvas);
  1924.             tShape->Intersect(ev, bShape);
  1925.         }    
  1926.  
  1927.         myCanvasFacet = myCanvas->GetFacet(ev);
  1928.         containingFacet = myCanvasFacet->GetContainingFacet(ev);
  1929.         if ( containingFacet )
  1930.             parentCanvasFacet = containingFacet->GetCanvas(ev)->GetFacet(ev);
  1931.         else
  1932.             THROW(kODErrFacetNotFound);
  1933.     
  1934.         TempODTransform xform = somSelf->AcquireWindowFrameTransform(ev, kODNULL);
  1935.         tShape->Transform(ev, xform);
  1936.         ODReleaseObject(ev, xform);
  1937.         xform = parentCanvasFacet->AcquireWindowFrameTransform(ev, kODNULL);
  1938.         tShape->InverseTransform(ev, xform);
  1939.     
  1940.         // since stuff was drawn on my canvas, invalidate my parent canvas
  1941.         // so that that content will get copied there.
  1942.         parentCanvasFacet->Invalidate(ev, tShape, kODNULL);
  1943.     
  1944.         // notify my canvas' owner that drawing has occurred, and pixels
  1945.         // need to be copied to the parent canvas
  1946.         TempODPart owner = myCanvas->AcquireOwner(ev);
  1947.         WASSERTM( owner != kODNULL, "Facet::DrawnIn - no owner for canvas");
  1948.         owner->CanvasUpdated(ev, myCanvas);
  1949.     SOM_CATCH_ALL
  1950.     SOM_ENDTRY
  1951. }
  1952.  
  1953. //------------------------------------------------------------------------------
  1954. // ODFacet: ContainsPoint
  1955. //------------------------------------------------------------------------------
  1956.  
  1957. SOM_Scope ODBoolean  SOMLINK ODFacetContainsPoint(ODFacet *somSelf, Environment *ev,
  1958.         ODPoint* point,
  1959.         ODCanvas* biasCanvas)
  1960. {
  1961.     ODFacetData *somThis = ODFacetGetData(somSelf);
  1962.     ODFacetMethodDebug("ODFacet","ContainsPoint");
  1963.  
  1964.     ODBoolean result = kODFalse;    ODVolatile(result);
  1965.     
  1966.     SOM_TRY
  1967.         ODPoint bPoint = BiasPointSet(ev, point, biasCanvas);
  1968.         if ( _fActiveShape || _fClipShape )
  1969.             result = ((!_fActiveShape || _fActiveShape->ContainsPoint(ev, &bPoint))
  1970.                      && (!_fClipShape || _fClipShape->ContainsPoint(ev, &bPoint)));
  1971.         else
  1972.         {
  1973.             TempODShape frameShape = _fFrame->AcquireFrameShape(ev, kNoBias);
  1974.             result = frameShape->ContainsPoint(ev, &bPoint);
  1975.         }
  1976.     SOM_CATCH_ALL
  1977.         result = kODFalse;
  1978.     SOM_ENDTRY
  1979.  
  1980.     return result;
  1981. }
  1982.  
  1983. //------------------------------------------------------------------------------
  1984. // ODFacet: ActiveBorderContainsPoint
  1985. //------------------------------------------------------------------------------
  1986.  
  1987. SOM_Scope ODBoolean  SOMLINK ODFacetActiveBorderContainsPoint(ODFacet *somSelf, Environment *ev,
  1988.         ODPoint* point,
  1989.         ODCanvas* biasCanvas)
  1990. {
  1991.     ODFacetData *somThis = ODFacetGetData(somSelf);
  1992.     ODFacetMethodDebug("ODFacet","ActiveBorderContainsPoint");
  1993.  
  1994.     if ( _fActiveBorderShape == kODNULL )
  1995.         return kODFalse;
  1996.  
  1997.     SOM_TRY
  1998.         ODPoint bPoint = BiasPointSet(ev, point, biasCanvas);
  1999.         // transform point to window coordinates
  2000.         TempODTransform winToFrame = somSelf->AcquireWindowFrameTransform(ev, kODNULL);
  2001.     
  2002.         ODPoint framePoint = bPoint;
  2003.         winToFrame->TransformPoint(ev, &framePoint);
  2004.         return _fActiveBorderShape->ContainsPoint(ev, &framePoint);
  2005.     SOM_CATCH_ALL
  2006.     SOM_ENDTRY
  2007.     return kODFalse;
  2008. }
  2009.  
  2010. //------------------------------------------------------------------------------
  2011. // ODFacet: IsSelected
  2012. //------------------------------------------------------------------------------
  2013.  
  2014. SOM_Scope ODBoolean  SOMLINK ODFacetIsSelected(ODFacet *somSelf, Environment *ev)
  2015. {
  2016.     ODFacetData *somThis = ODFacetGetData(somSelf);
  2017.     ODFacetMethodDebug("ODFacet","IsSelected");
  2018.  
  2019.     return _fIsSelected;
  2020. }
  2021.  
  2022. //------------------------------------------------------------------------------
  2023. // ODFacet: SetSelected
  2024. //------------------------------------------------------------------------------
  2025.  
  2026. SOM_Scope void  SOMLINK ODFacetSetSelected(ODFacet *somSelf, Environment *ev,
  2027.         ODBoolean isSelected)
  2028. {
  2029.     ODFacetData *somThis = ODFacetGetData(somSelf);
  2030.     ODFacetMethodDebug("ODFacet","SetSelected");
  2031.  
  2032.     _fIsSelected = isSelected;
  2033. }
  2034.  
  2035. //------------------------------------------------------------------------------
  2036. // ODFacet: GetHighlight
  2037. //------------------------------------------------------------------------------
  2038.  
  2039. SOM_Scope ODHighlight  SOMLINK ODFacetGetHighlight(ODFacet *somSelf, Environment *ev)
  2040. {
  2041.     ODFacetData *somThis = ODFacetGetData(somSelf);
  2042.     ODFacetMethodDebug("ODFacet","GetHighlight");
  2043.  
  2044.     return _fHighlight;
  2045. }
  2046.  
  2047. //------------------------------------------------------------------------------
  2048. // ODFacet: ChangeHighlight
  2049. //------------------------------------------------------------------------------
  2050.  
  2051. SOM_Scope void  SOMLINK ODFacetChangeHighlight(ODFacet *somSelf, Environment *ev,
  2052.         ODHighlight highlight)
  2053. {
  2054.     ODFacetData *somThis = ODFacetGetData(somSelf);
  2055.     ODFacetMethodDebug("ODFacet","ChangeHighlight");
  2056.  
  2057.     SOM_TRY
  2058.         _fHighlight = highlight;
  2059.         TempODPart tempPart = _fFrame->AcquirePart(ev);
  2060.         tempPart->HighlightChanged(ev, somSelf);
  2061.     SOM_CATCH_ALL
  2062.     SOM_ENDTRY
  2063. }
  2064.  
  2065. //------------------------------------------------------------------------------
  2066. // ODFacet: GetNode
  2067. //------------------------------------------------------------------------------
  2068.  
  2069. SOM_Scope FacetNode*  SOMLINK ODFacetGetNode(ODFacet *somSelf, Environment *ev)
  2070. {
  2071.     ODFacetData *somThis = ODFacetGetData(somSelf);
  2072.     ODFacetMethodDebug("ODFacet","GetNode");
  2073.  
  2074.     return _fNode;
  2075. }
  2076.  
  2077. //------------------------------------------------------------------------------
  2078. // ODFacet: NeedsUpdate
  2079. //------------------------------------------------------------------------------
  2080.  
  2081. SOM_Scope ODBoolean  SOMLINK ODFacetNeedsUpdate(ODFacet *somSelf, Environment *ev)
  2082. {
  2083.     ODFacetData *somThis = ODFacetGetData(somSelf);
  2084.     ODFacetMethodDebug("ODFacet","NeedsUpdate");
  2085.  
  2086.     return _fNeedsUpdate;
  2087. }
  2088.  
  2089. //------------------------------------------------------------------------------
  2090. // ODFacet: SetNeedsUpdate
  2091. //------------------------------------------------------------------------------
  2092.  
  2093. SOM_Scope void  SOMLINK ODFacetSetNeedsUpdate(ODFacet *somSelf, Environment *ev,
  2094.         ODBoolean needsUpdate)
  2095. {
  2096.     ODFacetData *somThis = ODFacetGetData(somSelf);
  2097.     ODFacetMethodDebug("ODFacet","SetNeedsUpdate");
  2098.  
  2099.     _fNeedsUpdate = needsUpdate;
  2100. }
  2101.